package com.asiainfo.lop.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;

/**
 * @author : wucm
 * @version V1.0
 * @Description : 日期工具类
 * @date : 2015年4月6日 上午11:08:15
 */
public class DateUtil {
    private static DateUtil ldu_ = null;

    public static DateUtil getInstance() {
        if (ldu_ == null) {
            ldu_ = new DateUtil();
        }
        return ldu_;
    }

    /**
     * @param dateFormat 日期格式例如：yyyyMMddHHmmss
     * @return String
     * @Description : 返回上周同日
     * @author : wucm
     * @date : 2015年11月12日 上午11:01:23
     */
    public String getLastWeekSameDay(String dateStr, String dateFormat) {
        return convertDate(dateStr, dateFormat, Calendar.DAY_OF_YEAR, -7);
    }

    /**
     * @param dateFormat 日期格式例如：yyyyMMddHHmmss
     * @return String
     * @Description : 返回上月同日
     * @author : wucm
     * @date : 2015年11月12日 上午11:02:14
     */
    public String getLastMonthSameDay(String dateStr, String dateFormat) {
        return convertDate(dateStr, dateFormat, Calendar.MONTH, -1).substring(0, 8);
    }

    /**
     * @return String
     * @Description : 返回上月第一天
     * @author : wucm
     * @date : 2015年11月14日 上午10:41:42
     */
    public String getLastMonthStartDay(String dateStr, String dateFormat) {
        return convertDate(getThisMonthStartDay(dateStr), dateFormat, Calendar.MONTH, -1);
    }

    /**
     * @return String
     * @Description : 返回上月最后一天
     * @author : wucm
     * @date : 2015年11月14日 上午10:40:24
     */
    public String getLastMonthEndDay(String dateStr, String dateFormat) {
        return convertDate(getThisMonthStartDay(dateStr), dateFormat, Calendar.DAY_OF_YEAR, -1);
    }

    /**
     * @return String
     * @Description : 返回给定日期的第一天
     * @author : wucm
     * @date : 2015年11月14日 上午10:37:50
     */
    public String getThisMonthStartDay(String dateStr) {
        dateStr = dateStr.replaceAll("/", "").replaceAll("-", "");
        return dateStr.substring(0, 6) + "01";
    }

    /**
     * @param dateFormat 日期格式例如：yyyyMMddHHmmss
     * @return String
     * @Description : 返回今天
     * @author : wucm
     * @date : 2015年11月12日 上午10:52:56
     */
    public String getToday(String dateFormat) {
        SimpleDateFormat formatter = new SimpleDateFormat(dateFormat, Locale.CHINESE);
        Date thedate = new Date();
        return formatter.format(thedate);
    }

    /**
     * @return String
     * @Description : 返回昨天
     * @author : wucm
     * @date : 2015年11月12日 上午11:05:08
     */
    public String getYesterday(String todaystr, String dateFormat) {
        return convertDate(todaystr, dateFormat, Calendar.DAY_OF_YEAR, -1);
    }

    /**
     * @param dateStr    当前日期
     * @param dateFormat 当前日期的格式
     * @param feild      处理类型，例如Calendar.DAY_OF_YEAR
     * @param num        0当前，1往后，-1往前
     * @return String
     * @Description : 计算相对于dateStr的日期
     * @author : wucm
     * @date : 2015年11月12日 上午10:43:00
     */
    public String convertDate(String dateStr, String dateFormat, int feild, int num) {
        String s = null;
        try {
            SimpleDateFormat formatter = new SimpleDateFormat(dateFormat, Locale.CHINESE);
            Calendar calendar = new GregorianCalendar();
            Date date = formatter.parse(dateStr);
            calendar.setTime(date);
            calendar.add(feild, num);
            Date dateResult = calendar.getTime();

            if (dateResult == null) {
                s = formatter.format(date);
            } else {
                s = formatter.format(dateResult);
            }
        } catch (Exception e) {
            System.out.println(e);
        }

        return s;
    }

    /**
     * @param dateFormat 日期格式例如：yyyyMMddHHmmss
     * @return String
     * @Description : 返回几天前或者几天后
     * @author : wucm
     * @date : 2015年11月12日 上午11:08:28
     */
    public String getXDay(String todaystr, String dateFormat, int x) {
        return convertDate(todaystr, dateFormat, Calendar.DAY_OF_YEAR, x);
    }

    /**
     * @param dateFormat 日期格式例如：yyyyMMddHHmmss
     * @return String
     * @Description : 返回几小时前或者几小时后
     * @author : wucm
     * @date : 2015年11月12日 上午11:08:28
     */
    public String getXHour(String todaystr, String dateFormat, int x) {
        return convertDate(todaystr, dateFormat, Calendar.HOUR_OF_DAY, x);
    }

    /**
     * @param dateFormat 日期格式例如：yyyyMMddHHmmss
     * @return String
     * @Description : 返回几分钟前或者几分钟后
     * @author : wucm
     * @date : 2015年11月12日 上午11:08:28
     */
    public String getXMinute(String todaystr, String dateFormat, int x) {
        return convertDate(todaystr, dateFormat, Calendar.MINUTE, x);
    }

    /**
     * 日期格式转换
     *
     * @param date 日期格式例如：yyyyMMddHHmmss
     * @return
     */
    public String dateFormat(String date, String oldFormat, String newFormat) {
        SimpleDateFormat sdf = new SimpleDateFormat(oldFormat, Locale.CHINESE);
        SimpleDateFormat sdf2 = new SimpleDateFormat(newFormat, Locale.CHINESE);
        String date2 = null;
        try {
            date2 = sdf2.format(sdf.parse(date));
        } catch (ParseException e) {
            System.err.println(e);
        }
        return date2;
    }

    /**
     * @param date
     * @param format 日期格式例如：yyyyMMddHHmmss
     * @return Date
     * @Description : 将字符串转换成日期
     * @author : wucm
     * @date : 2015年7月13日 下午5:37:54
     */
    public Date toDate(String date, String format) {
        SimpleDateFormat formatter = null;
        Date date1 = null;
        try {
            formatter = new SimpleDateFormat(format, Locale.CHINESE);
            date1 = formatter.parse(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return date1;
    }

    /**
     * @param date
     * @param newFormat 日期格式例如：yyyyMMddHHmmss
     * @return String
     * @Description : 日期格式转换
     * @author : wucm
     * @date : 2015年7月13日 下午5:49:06
     */
    public String dateFormat(Date date, String newFormat) {
        SimpleDateFormat sdf2 = new SimpleDateFormat(newFormat, Locale.CHINESE);
        String date2 = sdf2.format(date);
        return date2;
    }

    /**
     * @return String
     * @Description : 获取两个时间之间的小时
     * @author : zlc
     * @date : 2016年1月7日 下午5:06:19
     */
    public String getMinCount(String startTime, String endTime, String format) {
        SimpleDateFormat sd = new SimpleDateFormat(format, Locale.CHINESE);
        long result = 0;
        try {
            result = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        double result2 = Math.round((result / (1000 * 60 * 60.0)) * 10.0) / 10.0;// 将毫秒转化为小时
        return String.valueOf(result2);
    }

    /**
     * @return long
     * @Description : 获取两个时间之间的小时
     * @author : zlc
     * @date : 2016年3月21日 下午5:04:12
     */
    public long getHourCount(String startTime, String endTime, String format) {
        SimpleDateFormat sd = new SimpleDateFormat(format, Locale.CHINESE);
        long result = 0;
        try {
            result = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
        } catch (ParseException e) {
            System.err.println(e);
        }
        return result / (1000 * 60 * 60);
    }

    /**
     * @return String
     * @Description : 获取当前时间到当日凌晨的分钟数
     * @author : zlc
     * @date : 2016年3月21日 下午4:22:39
     */
    public long getMinCount(String startTime, String format) {
        SimpleDateFormat sd = new SimpleDateFormat(format, Locale.CHINESE);
        String curDate = getToday("yyyy-MM-dd") + " 00:00:00";
        long result = 0;
        try {
            result = sd.parse(startTime).getTime() - sd.parse(curDate).getTime();
        } catch (ParseException e) {
            System.err.println(e);
        }
        return result / (1000 * 60);
    }

    /**
     * @return String
     * @Description : 获取两个时间之间的分钟
     * @author : zlc
     * @date : 2016年3月21日 下午4:22:39
     */
    public double getMinCountTwo(String startTime, String endTime, String format) {
        SimpleDateFormat sd = new SimpleDateFormat(format, Locale.CHINESE);
        long result = 0;
        try {
            result = sd.parse(endTime).getTime() - sd.parse(startTime).getTime();
        } catch (ParseException e) {
            System.err.println(e);
        }
        double result2 = Math.round((result / (1000 * 60.000)) * 1000.000) / 1000.000;// 将毫秒转化为分钟
        return result2;
    }

    public static void main(String[] args) {
        DateUtil du = DateUtil.getInstance();
        String now = du.getToday("mm");
        System.out.println(now);
        String str = du.dateFormat("2015-11-23 09:35", "yyyy-MM-dd HH:mm", "yyyy-MM-dd");
        System.out.println(str);
        String str1 = du.getMinCount("2015-11-23 07:35:00", "2015-11-23 09:40:00", "yyyy-MM-dd HH:mm:ss");
        System.out.println(str1);
    }
}
